거의 번역글이다.
캐시 처리는 쉬웠던 적이 없다. 근데 HTTP 캐시 헤더는 더 햇갈린다. 그중 최악은 no-cache
와 private
이다. 얘네는 뭐하는 놈들일까?
Cache-Control: private, no-cache
얼핏 보기엔, 이 요청에 대한 결과를 저장하지말고 어딘가 숨겨두라는 것 처럼 보인다.
하지만 그렇게 생각했다면 완전 틀렸다.
저 헤더의 내용은 이렇다. "이 요청에 대한 응답을 모든 브라우저에서 캐시할 것. 그러나 사용시에 재검증하세요." 그러니까 사실은 노캐시가 아니라 캐싱을 더 많이 되도록 하는 설정인 것이다.
특히 no-cache
를 설정한다면 명시적으로 더욱 더 캐시해라고 말하는 것이다. 다만 브라우저나 CDN이 해당 리소스를 요청할 때 If-Match
혹은 If-Modified-Since
를 동봉해서 캐시가 최신 상태인지 확인을 먼저 하라는 뜻이다.
private
은 캐시는 가능하지만 말단인 브라우저(CDN이나 Proxy가 아닌)에서만 해라는 뜻이다.
캐시를 안하고 싶을땐 그럼 어떻게 해야할까.
그럴 땐 요청 헤더에 다음을 포함해야한다.
Cache-Control: no-store
하지만 사각지대가 하나 있는데, 이미 브라우저에 요청에 대한 캐시가 되어있는 경우, 그걸 없애주지는 못한다. 현재 있는 캐시까지 만료시키고자 한다면 max-age=0
을 추가해야한다.
트위터가 이 문제로 골머리를 썩힌적이 있다. no-store
를 써야하는 상황에 no-cache
를 사용해서 유저의 개인 메세지를 브라우저 캐시에 실수로 남겨버린 것이다. 자기 컴퓨터에서만 쓴다면 문제가 되지 않지만... 공공 장소에서 트위터를 했다면 거기 사적인 메세지가 암호화도 안된채 남게 된것이다.